package com.newlink.building.main.other

import android.content.Context
import com.newlink.mqtt.mqttv5.IMqttStatusListener
import com.newlink.mqtt.mqttv5.IPublishActionListener
import com.newlink.mqtt.mqttv5.IReceiveActionListener
import com.newlink.mqtt.mqttv5.MqttV5
import com.newlink.building.common_base.utils.NLog // Assuming Fvl is a custom logging utility
import com.newlink.building.common_base.utils.EnhancedLogger
import com.newlink.building.common_base.utils.logInfo
import com.newlink.building.common_base.utils.logWarn

/**
 * MQTT 工具类。
 * 作为单例对象，提供 MQTT 客户端的连接、订阅、发布和管理功能。
 */
object Module_Main_MqttUtils {

    // MQTT V5 客户端实例
    var mqttV5Client: MqttV5? = null

    /**
     * 连接到 MQTT 服务器。
     * 如果 MQTT 客户端已存在，则先销毁再重新创建和连接。
     *
     * @param context Context 实例，用于初始化 MQTT 客户端。
     * @param clientId 客户端 ID。如果为 null 或空，则使用空字符串。
     * @param subscribeTopics 要订阅的主题列表。
     * @param userName 用户名。如果为 null 或空，则使用空字符串。
     * @param password 密码。如果为 null 或空，则使用空字符串。
     * @param mqttServer MQTT 服务器地址和端口，默认为 "tcp://172.16.1.91:1884"。
     * @param statusListener MQTT 连接状态监听器。
     * @param msgReceiver MQTT 消息接收监听器。
     */
    fun connect(
        context: Context,
        clientId: String?,
        subscribeTopics: List<String>,
        userName: String?,
        password: String?,
        mqttServer: String = "tcp://172.16.1.91:1884",
        statusListener: IMqttStatusListener,
        msgReceiver: IReceiveActionListener,
    ) {
        // 如果已经有客户端实例，先销毁它以确保新连接的清洁性
        destroy()

        val actualClientId = clientId.orEmpty() // 使用 orEmpty() 避免 null
        val actualUserName = userName.orEmpty()
        val actualPassword = password.orEmpty()

        // 使用 EnhancedLogger 记录详细连接信息
        EnhancedLogger.i("MqttUtils", "========== MQTT 连接参数详情 ==========")
        EnhancedLogger.i("MqttUtils", "MQTT Server: $mqttServer")
        EnhancedLogger.i("MqttUtils", "Client ID: $actualClientId")
        EnhancedLogger.i("MqttUtils", "Username: $actualUserName")
        EnhancedLogger.i("MqttUtils", "Password: ${if (actualPassword.isNotEmpty()) "***${actualPassword.takeLast(3)}" else "空"}")
        EnhancedLogger.i("MqttUtils", "Subscribe Topics: $subscribeTopics")
        EnhancedLogger.i("MqttUtils", "Context: ${context.javaClass.simpleName}")
        EnhancedLogger.i("MqttUtils", "=====================================")

        NLog.d("[MqttUtils] Connecting to MQTT server: $mqttServer")
        NLog.d("[MqttUtils] Client ID: $actualClientId, Username: $actualUserName")

        try {
            mqttV5Client = MqttV5.Builder()
                .setUserContext(context)
                .setClientId(actualClientId)
                .setUserName(actualUserName)
                .setPassword(actualPassword)
                // 订阅主题在这里设置，但原始代码中是被注释掉的，如果需要，应该取消注释
                // .setSubscribeTopics(subscribeTopics)
                .setKeepAliveInterval(60) // 心跳间隔，秒
                .setConnectionTimeout(60) // 连接超时，秒（从30秒增加到60秒）
                .setAutomaticReconnect(false) // 不自动重连，由外部逻辑控制
                .setMaxReconnectDelay(10000) // 最大重连延迟，毫秒
                .setSessionExpiryInterval(0) // 会话过期时间，0表示会话永不过期
                .setSubscribeQos(MqttV5.QOS_UNRELIABLE) // 订阅消息QoS
                .setPublishQos(MqttV5.QOS_UNRELIABLE) // 发布消息QoS
                .setPublishMsgRetained(true) // 发布消息保留
                .setCleanSession(true) // 清理会话
                // SSL/TLS 配置（原始代码中被注释，如果需要，请取消注释并确保证书正确配置）
                // .setSocketFactory(SSLUtil.getSSL()) // Custom SSLSocketFactory
                // .setSocketFactory(SSLSocketFactory.getDefault())
                .setHttpsHostnameVerificationEnabled(false) // 禁用 HTTPS 主机名验证 (注意安全性影响)
                // .setSslHostnameVerifier { hostname, session -> true } // 自定义 SSL 主机名验证器 (注意安全性影响)
                .setIMqttStatusListener(statusListener) // 设置状态监听器
                .setIReceiveActionListener(msgReceiver) // 设置消息接收监听器
                .build()

            EnhancedLogger.i("MqttUtils", "MQTT 客户端构建成功，开始连接...")
            mqttV5Client?.connect(mqttServer)
            EnhancedLogger.success("MqttUtils", "MQTT 连接请求已发送，等待服务器响应...")
            logInfo<Module_Main_MqttUtils>("[MqttUtils] MQTT client build and connect initiated successfully.")
        } catch (e: Exception) {
            EnhancedLogger.e("MqttUtils", "MQTT 连接失败", e)
            EnhancedLogger.e("MqttUtils", "连接失败详情: Server=$mqttServer, ClientId=$actualClientId, Username=$actualUserName")
            NLog.e("[MqttUtils] Error connecting to MQTT: ${e.message}")
            e.printStackTrace() // 打印堆栈跟踪
        }
    }

    /**
     * 订阅指定主题列表。
     * @param topics 要订阅的主题列表。
     */
    fun subscribeTopicList(topics: List<String>) {
        if (mqttV5Client?.isConnected == true) {
            mqttV5Client?.subscribeTopics(topics)
            NLog.d("[MqttUtils] Subscribing to topics: $topics")
        } else {
            logInfo<Module_Main_MqttUtils>("[MqttUtils] Cannot subscribe to topics, MQTT client not connected.")
        }
    }

    /**
     * 发布 MQTT 消息。
     * @param topic 消息发布的主题。
     * @param msg 消息内容。
     * @param sendCallback 消息发布结果的回调。
     */
    fun sendMsg(topic: String, msg: String, sendCallback: IPublishActionListener) {
        if (mqttV5Client?.isConnected == true) {
            // QoS 设置为 0，retain 设置为 false（原始代码中 publishMsgRetained 默认为 true，这里 publishMsg 中为 false）
            // 注意：publishMsg(topic, qos, retained, msg, sendCallback)
            mqttV5Client?.publishMsg(topic, 0, false, msg, sendCallback)
            NLog.d("[MqttUtils] Publishing message to topic: $topic, msg: $msg")
        } else {
            logWarn<Module_Main_MqttUtils>("[MqttUtils] Cannot send message, MQTT client not connected.")
            // 可以在这里调用 sendCallback.onFailed("Not connected") 来通知调用方
        }
    }

    /**
     * 检查 MQTT 客户端是否已连接。
     * @return 如果已连接返回 true，否则返回 false。
     */
    fun isConnect(): Boolean {
        return mqttV5Client?.isConnected == true
    }

    /**
     * 取消订阅所有主题（原始代码中此方法为空实现）。
     * 注意：如果需要取消特定主题，应在 `MqttV5` 库中查找对应方法。
     */
    fun unsubscribeTopic() {
        NLog.d("[MqttUtils] Unsubscribing all topics (method current no-op in MqttV5 library).")
        // 原始代码中此方法为空实现，如果 MqttV5 库提供了批量取消订阅的方法，可以在这里调用。
        // mqttV5Client?.unsubscribeTopics(listOf(...))
    }

    /**
     * 断开 MQTT 连接。
     */
    fun disConnect() {
        if (mqttV5Client?.isConnected == true) {
            mqttV5Client?.disconnect()
            logInfo<Module_Main_MqttUtils>("[MqttUtils] MQTT client disconnected.")
        } else {
            NLog.d("[MqttUtils] MQTT client not connected, no need to disconnect.")
        }
    }

    /**
     * 销毁 MQTT 客户端实例并释放资源。
     */
    fun destroy() {
        mqttV5Client?.destroy()
        mqttV5Client = null
        logInfo<Module_Main_MqttUtils>("[MqttUtils] MQTT client destroyed and released.")
    }
}